home *** CD-ROM | disk | FTP | other *** search
- /* Programmautor: Rainer Zeitler
- * Programm für Lattice-C
- * Compiler-Optionen: lc -Lt screenmodes.c
- */
- #include <exec/types.h>
- #include <exec/memory.h>
- #include <graphics/gfx.h>
- #include <graphics/display.h>
- #include <graphics/displayinfo.h>
- #include <libraries/gadtools.h>
- #include <intuition/intuition.h>
- #include <intuition/intuitionbase.h>
- #include <intuition/gadgetclass.h>
- #include <clib/exec_protos.h>
- #include <clib/intuition_protos.h>
- #include <clib/graphics_protos.h>
-
- struct GfxBase *GfxBase=NULL;
- struct IntuitionBase *IntuitionBase=NULL;
- struct Library *GadToolsBase=NULL;
- struct DiskfontBase *DiskfontBase=NULL;
-
- static struct Screen *ModeScreen=NULL;
- static struct Window *ModeWindow=NULL;
- static APTR VisualInfo = NULL;
- static struct Gadget *GList = NULL;
- static struct TextAttr topaz8 = {
- (STRPTR)"topaz.font", 8, 0x00, 0x00 };
- static struct TextFont *ModesFont=NULL;
- static struct Gadget *ModeGadgets[5];
- static struct IntuiMessage ModeMsg;
- static char *Answer[] = { "Ja","Nein" };
- static ULONG ModeID=0, DepthID=2;
- static struct DisplayNode {
- struct Node dn_Node;
- struct DimensionInfo diminfo;
- struct DisplayInfo dispinfo;
- ULONG modeID;
- };
-
- static struct List *DispList = NULL;
- static struct TagItem WindowTags[] = {
- WA_Left, 45, WA_Top, 63, WA_Width, 450, WA_Height, 205,
- WA_IDCMP, BUTTONIDCMP|LISTVIEWIDCMP,
- WA_Flags, WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_ACTIVATE,
- WA_Gadgets, 0l, WA_Title, (ULONG)"Verfügbare Screen-Modi",
- WA_CustomScreen, 0l, TAG_DONE };
-
- static struct TagItem ScreenTags[] = {
- SA_Left, 0, SA_Top, 0, SA_Width, STDSCREENWIDTH,
- SA_Height, STDSCREENHEIGHT, SA_Depth, 2,
- SA_Type, CUSTOMSCREEN, SA_DisplayID, 593925,
- TAG_DONE };
-
- void RefreshAnzeige(struct DisplayNode *node) {
- struct RastPort *rp=(struct RastPort *)ModeWindow->RPort;
- struct DimensionInfo *mdinfo=&(node->diminfo);
- struct DisplayInfo *dispinfo=&(node->dispinfo);
- char *name=node->dn_Node.ln_Name, dummy[50];
- WORD Top=ModeScreen->BarHeight+2;
- SetAPen(rp,0); SetDrMd(rp,JAM1);
- RectFill( rp, 224, Top+2, 224+216 , Top+90 );
- SetAPen(rp,2); Top+=9; Move( rp, 224, Top);
- if( TextLength(rp,name,strlen(name)) > 216 ) {
- long i=strlen(name)-1;
- while( i ) {
- if( TextLength(rp,name,i) <= 216 ) break;
- else i--;
- }
- Text( rp, name,i);
- } else Text( rp, name,strlen(name));
- Top+=8; SetDrMd(rp,JAM1); SetAPen(rp,1);
- sprintf(dummy,"Max. Farben: %d",1 << (mdinfo->MaxDepth-1));
- Move( rp, 224,Top ); Text( rp, dummy,strlen(dummy)); Top+=8;
- sprintf(dummy,"Breite:%d, Höhe:%d",mdinfo->Nominal.MaxX-
- mdinfo->Nominal.MinX+1, mdinfo->Nominal.MaxY-
- mdinfo->Nominal.MinY+1);
- Move( rp, 224, Top ); Text( rp, dummy,strlen(dummy));
- Top+=10; SetAPen(rp,3);
- sprintf(dummy,"Standard-Overscan:");
- Move( rp, 224, Top); Text( rp, dummy,strlen(dummy));
- Top+=8; SetAPen(rp,1);
- sprintf(dummy,"Breite:%d, Höhe:%d",mdinfo->StdOScan.MaxX-
- mdinfo->StdOScan.MinX+1,mdinfo->StdOScan.MaxY-
- mdinfo->StdOScan.MinY+1);
- Move( rp, 224, Top); Text( rp, dummy,strlen(dummy));
- Top+=8; SetAPen(rp,3); sprintf(dummy,"Maximaler Overscan:");
- Move( rp, 224, Top); Text( rp, dummy,strlen(dummy));
- Top+=8; SetAPen(rp,1);
- sprintf(dummy,"Breite:%d, Höhe:%d",mdinfo->MaxOScan.MaxX-
- mdinfo->MaxOScan.MinX+1,mdinfo->MaxOScan.MaxY-
- mdinfo->MaxOScan.MinY+1);
- Move( rp,224,Top );Text( rp, dummy,strlen(dummy));Top+=10;
- sprintf(dummy,"ECS-Modus? %s",dispinfo->PropertyFlags&
- DIPF_IS_ECS?Answer[0]:Answer[1]);
- Move( rp,224,Top );Text( rp, dummy,strlen(dummy)); Top+=8;
- sprintf(dummy,"Interlace-Modus? %s",dispinfo->PropertyFlags&
- DIPF_IS_LACE?Answer[0]:Answer[1]);
- Move( rp,224,Top );Text( rp, dummy,strlen(dummy)); Top+=8;
- sprintf(dummy,"Verschiebbar? %s",dispinfo->PropertyFlags&
- DIPF_IS_DRAGGABLE?Answer[0]:Answer[1]);
- Move( rp,224,Top ); Text( rp, dummy,strlen(dummy));
- }
- /* Sucht der nr-ten Eintrag */
- struct DisplayNode *FindNode(long nr) {
- struct DisplayNode *dnode = DispList->lh_Head;
- while( nr-- > 0 )
- dnode = (struct DisplayNode *) dnode->dn_Node.ln_Succ;
- return dnode;
- }
- /* Diese Funktion wird angesprungen, wenn ein neuer Screen- *
- * Modus angewählt wurde */
- int Modus(void) {
- struct DisplayNode *node=FindNode(ModeMsg.Code);
- struct DimensionInfo *dinfo;
- RefreshAnzeige(node);
- dinfo=&(node->diminfo);
- GT_SetGadgetAttrs(ModeGadgets[3],ModeWindow,NULL,GTSL_Min,
- 0,GTSL_Max,dinfo->MaxDepth-1, GTSL_Level,
- dinfo->MaxDepth-1, TAG_DONE);
- GT_SetGadgetAttrs(ModeGadgets[4],ModeWindow,NULL,
- GTNM_Number,1 << (dinfo->MaxDepth-1),TAG_DONE);
- DepthID=dinfo->MaxDepth;
- ModeID=node->modeID;
- return 1;
- }
- /* Diese Funktion wird angesprungen, wenn die Anzahl der *
- * Farben modifiziert wurde */
- int Slider(void) {
- GT_SetGadgetAttrs(ModeGadgets[4],ModeWindow,NULL,
- GTNM_Number,1 << ModeMsg.Code,TAG_DONE);
- return 1;
- }
- /* OK-Gadget ausgewählt */
- int OK(void) { return 2; }
- /* Abbruch-Gadget ausgewählt */
- int Abbruch(void) { return 0; }
- /* Den reservierten Speicher für die Exec-Liste freigeben */
- static void FreeScreenModes() {
- struct DisplayNode *wnode, *nnode;
- wnode = (struct DisplayNode *) DispList->lh_Head;
- while(nnode=(wnode->dn_Node.ln_Succ)) {
- if(wnode->dn_Node.ln_Name)
- FreeMem(wnode->dn_Node.ln_Name,
- strlen(wnode->dn_Node.ln_Name) +1);
- Remove((struct Node *) wnode);
- FreeMem(wnode, sizeof(struct DisplayNode));
- wnode = nnode;
- }
- FreeMem(DispList, sizeof(struct List));
- }
- /* Diese Funktion durchsucht die interne Datenbank der *
- * Screen-Modi und erzeugt eine verkettet Exec-Liste */
- static BOOL ScanModes( void ) {
- struct DisplayInfo dinfo;
- struct NameInfo ninfo;
- struct DisplayNode *dnode;
- ULONG modeID=INVALID_ID;
- if( (DispList=AllocMem(sizeof(struct List),
- MEMF_CLEAR|MEMF_PUBLIC)) != NULL ) {
- NewList( DispList );
- while((modeID=NextDisplayInfo(modeID))!=INVALID_ID) {
- if( GetDisplayInfoData(NULL,(UBYTE *)&dinfo,
- sizeof(dinfo),DTAG_DISP,modeID) != 0 ) {
- if( (dinfo.NotAvailable == 0) &&
- (modeID & MONITOR_ID_MASK) ) {
- /* Hier gelangt das Programm nur dann hin, wenn
- * der Modus verfügbar ist und nicht der
- * Default-Monitor benötigt wird, sondern ein
- * PAL-, NTSC- oder andere Monitore */
- if( GetDisplayInfoData(NULL,(UBYTE *)&ninfo,
- sizeof(ninfo),DTAG_NAME,modeID) != 0 ) {
- if( (dnode=AllocMem(sizeof(struct DisplayNode),
- MEMF_CLEAR|MEMF_PUBLIC)) != NULL ) {
- if( (dnode->dn_Node.ln_Name=
- AllocMem(strlen(ninfo.Name)+1,
- MEMF_CLEAR|MEMF_PUBLIC)) != NULL ) {
- strcpy(dnode->dn_Node.ln_Name, ninfo.Name);
- GetDisplayInfoData(NULL, (UBYTE *)
- &(dnode->diminfo),sizeof(struct DimensionInfo),
- DTAG_DIMS, modeID);
- GetDisplayInfoData(NULL, (UBYTE *)
- &(dnode->dispinfo),sizeof(struct DisplayInfo),
- DTAG_DISP, modeID);
- dnode->modeID = modeID;
- AddTail(DispList, (struct Node *) dnode);
- }
- }
- }
- }
- }
- }
- return TRUE;
- }
- return FALSE;
- }
- /* Öffnen des Fensters auf dem gerade aktiven Screen */
- static BOOL InitWindow() {
- struct NewGadget ng;
- struct Gadget *g;
- WindowTags[ 8 ].ti_Data = (ULONG)ModeScreen;
- WindowTags[ 3 ].ti_Data = ModeScreen->BarHeight+1+140;
- WindowTags[0].ti_Data=ModeScreen->Width/2-
- WindowTags[2].ti_Data/2;
- WindowTags[1].ti_Data=ModeScreen->Height/2-
- WindowTags[3].ti_Data/2;
- if( ( VisualInfo = (APTR)GetVisualInfo(ModeScreen,
- TAG_DONE )) == NULL) return FALSE;
- if( ( g = (struct Gadget *)CreateContext( &GList )) ==
- NULL ) return FALSE;
- ng.ng_LeftEdge=8;ng.ng_TopEdge=ModeScreen->BarHeight+2;
- ng.ng_Width=210;ng.ng_Height=98;ng.ng_GadgetText=NULL;
- ng.ng_TextAttr=&topaz8;ng.ng_GadgetID=0;ng.ng_Flags=0;
- ng.ng_VisualInfo=VisualInfo;ng.ng_UserData=(APTR)Modus;
- g=(struct Gadget *)CreateGadget( LISTVIEW_KIND, g, &ng,
- GTLV_Labels, (ULONG)DispList, GTLV_ShowSelected,
- 0l, TAG_DONE );
- ModeGadgets[ 0 ] = g;
- ng.ng_Height = 19; ng.ng_GadgetText = "Übernehmen";
- ng.ng_TopEdge = WindowTags[3].ti_Data - ng.ng_Height-5;
- ng.ng_Width = 126; ng.ng_GadgetID = 1;
- ng.ng_Flags = PLACETEXT_IN; ng.ng_UserData=(APTR)OK;
- g = (struct Gadget *)CreateGadget(BUTTON_KIND,
- g,&ng,TAG_DONE );
- ModeGadgets[ 1 ] = g; if ( g == NULL ) return FALSE;
- ng.ng_LeftEdge = 442-ng.ng_Width;
- ng.ng_GadgetText = "Abbruch"; ng.ng_GadgetID = 2;
- ng.ng_UserData=(APTR)Abbruch;
- g = (struct Gadget *)CreateGadget( BUTTON_KIND,
- g, &ng, TAG_DONE );
- ModeGadgets[ 2 ] = g; if ( g == NULL ) return FALSE;
- ng.ng_UserData=(APTR)Slider; ng.ng_Height = 10;
- ng.ng_Flags = PLACETEXT_LEFT; ng.ng_LeftEdge = 8+9*8;
- ng.ng_GadgetText = "Farben: "; ng.ng_GadgetID = 3;
- ng.ng_TopEdge=ng.ng_TopEdge-15;
- ng.ng_Width=WindowTags[2].ti_Data-ng.ng_LeftEdge-50;
- g = (struct Gadget *)CreateGadget( SLIDER_KIND,
- g, &ng, GTSL_Max, 2, GTSL_MaxLevelLen,2,PGA_Freedom,
- LORIENT_HORIZ,GA_RelVerify, TRUE,TAG_DONE );
- ModeGadgets[ 3 ] = g; if ( g == NULL ) return FALSE;
- ng.ng_Flags = 0; ng.ng_LeftEdge = 442-4*8;
- ng.ng_GadgetText = NULL; ng.ng_Width=4*8;
- ng.ng_GadgetID = 4; ng.ng_UserData=(APTR)NULL;
- g = (struct Gadget *)CreateGadget( NUMBER_KIND,
- g, &ng, GTNM_Number, 2, GTNM_Border, TRUE,TAG_DONE );
- ModeGadgets[ 4 ] = g; if ( g == NULL ) return FALSE;
- WindowTags[ 6 ].ti_Data = (ULONG)GList;
- ModeWindow = OpenWindowTagList( NULL, WindowTags );
- if( ModeWindow == NULL ) return FALSE;
- GT_RefreshWindow( ModeWindow, NULL );
- DrawBevelBox( ModeWindow->RPort, 222,
- ModeScreen->BarHeight+2, 220, 92,
- GT_VisualInfo, VisualInfo, TAG_DONE );
- GT_SetGadgetAttrs(ModeGadgets[0],ModeWindow,NULL,
- GTLV_Selected,0,TAG_DONE);
- ModeMsg.Code=0; Modus();
- return TRUE;
- }
- /* Schließen des Fensters und Freigabe benötigter *
- * Ressourcen */
- void RemoveWindow( void ) {
- if( ModeWindow ) CloseWindow( ModeWindow );
- if( GList ) FreeGadgets( GList );
- if( VisualInfo ) FreeVisualInfo( VisualInfo );
- }
- /* Beantworten einer eingegangenen IDCMP-Message und *
- * verzweigen zur entsprechenden Funktion, die im *
- * Element UserData der Gadget-Struktur eingetragen *
- * ist. */
- int HandleIDCMP( void ) {
- struct IntuiMessage *msg;
- int (*func)(), ready = 1;
- if( (msg = (struct IntuiMessage *)
- GT_GetIMsg( ModeWindow->UserPort)) != NULL ) {
- CopyMem(( char * )msg, ( char * )&ModeMsg,
- (long)sizeof( struct IntuiMessage ));
- GT_ReplyIMsg( msg );
- switch ( ModeMsg.Class ) {
- case IDCMP_GADGETUP:
- case IDCMP_GADGETDOWN:
- func=(void *)((struct Gadget *)ModeMsg.IAddress)
- ->UserData;
- ready = func();
- break;
- default:
- break;
- }
- }
- return ready;
- }
- /* Warten auf das Eintreffen einer Nachricht am Port */
- int HandleWindow(void) {
- int res;
- do {
- WaitPort( ModeWindow->UserPort );
- } while( (res=HandleIDCMP()) == (int)1);
- return res;
- }
- main()
- {
- struct Screen *myscreen;
- GfxBase=OpenLibrary("graphics.library",37L);
- IntuitionBase=(struct IntuitionBase *)
- OpenLibrary("intuition.library",37L);
- GadToolsBase=OpenLibrary("gadtools.library",37L);
- DiskfontBase=OpenLibrary("diskfont.library",37L);
- if( GfxBase && IntuitionBase &&
- GadToolsBase && DiskfontBase ) {
- if( (ModesFont = OpenFont(&topaz8)) == NULL ) {
- if( (ModesFont = OpenDiskFont(&topaz8)) != NULL )
- AddFont( ModesFont );
- }
- if( ModesFont ) {
- if( ScanModes() ) {
- ModeScreen=IntuitionBase->ActiveScreen;
- if( InitWindow() )
- if( HandleWindow() == 2 ) {
- /* OK-Gadget wurde angeklickt. In ModeID finden
- * wir die ModeID, in DepthID die Anzahl der
- * Bitplanes. Die Daten müssen noch in die Tags
- * eingetragen werden, dann kann der Schirm
- * geöffnet werden */
- ScreenTags[6].ti_Data=ModeID;
- ScreenTags[4].ti_Data=DepthID;
- myscreen=OpenScreenTagList(NULL,&ScreenTags);
- if( myscreen ) {
- Delay( 5 * 50 );
- CloseScreen( myscreen );
- }
- }
- RemoveWindow();
- }
- FreeScreenModes();
- }
- }
- if( GfxBase ) CloseLibrary( GfxBase );
- if( IntuitionBase ) CloseLibrary( IntuitionBase );
- if( GadToolsBase ) CloseLibrary( GadToolsBase );
- if( DiskfontBase ) CloseLibrary( DiskfontBase);
- }
-